/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.presentacion.cliente;

import com.mindbox.mueblesalpes.negocio.cliente.ClienteServiceLocal;
import com.mindbox.mueblesalpes.negocio.entity.Ciudad;
import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.Departamento;
import com.mindbox.mueblesalpes.negocio.entity.Pais;
import com.mindbox.mueblesalpes.negocio.entity.TipoDocumento;
import com.mindbox.mueblesalpes.negocio.entity.TipoUsuario;
import com.mindbox.mueblesalpes.negocio.entity.Usuario;
import com.mindbox.mueblesalpes.negocio.exception.TiendaException;
import com.mindbox.mueblesalpes.negocio.utilidades.IUtilidades;
import com.mindbox.mueblesalpes.negocio.utilidades.UtilidadesMock;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import com.mindbox.mueblesalpes.presentacion.utils.ReglasNavegacion;
import com.mindbox.mueblesalpes.presentacion.utils.RequestParameters;
import java.util.Map;
import java.util.TreeMap;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

/**
 * Backing bean de la pantalla de edición de clientes
 * @author Diana Carolina
 */
public class ClienteEditBean {

    private Long idCliente;
    private Mensajes mensaje;
    private String tipoDocumento;
    private String numeroDocumento;
    private String nombreCompleto;
    private String telefonoResidencia;
    private String celular;
    private String direccion;
    private String ciudadResidencia;
    private String profesion;
    private String email;
    private String departamento;
    private String pais;
    private String tipoUsuario;
    private String nombreUsuario;
    private String password;
    @EJB
    private ClienteServiceLocal clienteEjb;
    @EJB
    private IUtilidades utilidades;

    /**
     * Constructor del Backing bean correspondiente a la página de edición
     */
    public ClienteEditBean() {
        mensaje = new Mensajes();
        FacesContext facescontext = FacesContext.getCurrentInstance();
        Cliente cliente = (Cliente) facescontext.getExternalContext().getSessionMap().get("ClienteEdit");
        if(cliente != null){
            cargarDatos(cliente);
        }
    }
    /**
     * Método que carga los tipos de documento para ser mostrados en la pantalla
     * @return Map correspondiente a los tipos de documento
     */
    public Map getListaTiposDocumento() {
        Map tipoDoc = new TreeMap();
        tipoDoc.put("", "Seleccionar");
        for (Object o : utilidades.consultarTipoDocumento()) {
            tipoDoc.put(o.toString(), o.toString());
        }
        return tipoDoc;
    }
    /**
     * Método que carga el listado de países
     * @return Map con los nombres de países
     */
    public Map getListaPaises() {
        Map paises = new TreeMap();
        paises.put("", "Seleccionar");
        for (Pais p : utilidades.consultarPaises()) {
            paises.put(p.getPais(), p.getIdPais());
        }
        return paises;

    }
    /**
     * Método que retorna carga una lista de nombres de ciudades
     * @return Map con los nombres de ciudades
     */
    public Map getListaCiudades(){
        Map ciudades = new TreeMap();
        ciudades.put("", "Seleccionar");
        for(Ciudad c: utilidades.consultarCiudades()){
            ciudades.put(c.getNombre(), c.getIdCiudad());
        }
        return ciudades;
    }
    /**
     * Método que retorna una lista con nombres de departamentos
     * @return Map con los nombres de departamento
     */
    public Map getListaDepartamento(){
        Map departamentos = new TreeMap();
        departamentos.put("", "Seleccionar");
        for(Departamento d: utilidades.consultarDepartamentos()){
            departamentos.put(d.getNombre(), d.getIdDepartamento());
        }
        return departamentos;
    }
    /**
     * Obtiene el valor del campo tipo usuario
     * @return
     */
    public Map getTiposUsuario(){
        /**
         * Se obtiene la sesion para verificar si el llamado a esta pagina viene
         * desde el carrito de compras.
         */
        HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        String next = null;
        if(sesion != null)
            next = (String)sesion.getAttribute(RequestParameters.next_page.name());
            
        Map tiposUsuario = new TreeMap();
        tiposUsuario.put("", "Seleccionar");
        for(Object o: utilidades.consultarTipoUsuarios()){
            if(next != null && !o.toString().equals(TipoUsuario.ADMINISTRADOR.name()))
                tiposUsuario.put(o.toString(), o.toString());
            else if( next == null )
                tiposUsuario.put(o.toString(), o.toString());
        }
        return tiposUsuario;
    }

    /**
     *  Carga los datos en los campos de la pantalla
     * @param clienteIn
     */
    private void cargarDatos(Cliente clienteIn) {

        tipoDocumento = clienteIn.getTipoDocumento().toString();
        numeroDocumento = clienteIn.getNumeroDocumento();
        nombreCompleto = clienteIn.getNombreCompleto();
        telefonoResidencia = clienteIn.getTelefonoResidencia();
        celular = clienteIn.getCelular();
        direccion = clienteIn.getDireccion();
        ciudadResidencia = clienteIn.getCiudadResidencia().getIdCiudad().toString();
        profesion = clienteIn.getProfesion();
        email = clienteIn.getEmail();
        departamento = clienteIn.getCiudadResidencia().getDepartamento().getIdDepartamento().toString();
        pais = clienteIn.getCiudadResidencia().getDepartamento().getPais().getIdPais().toString();
        tipoUsuario = clienteIn.getUsuario().getTipoUsuario().toString();
        nombreUsuario = clienteIn.getUsuario().getUsuario();
        password = clienteIn.getUsuario().getPwd();
        idCliente = clienteIn.getIdCliente();
        
    }

    /**
     * Obtiene el dato del campo celuar
     * @return dato ingresado por el usuario
     */
    public String getCelular() {
        return celular;
    }
    /**
     * Asigna el valor al campo celular
     * @param celular
     */
    public void setCelular(String celular) {
        this.celular = celular;
    }
    /**
     * Obtiene el nombre de la ciudad de residencia
     * @return nombre de la ciudad
     */
    public String getCiudadResidencia() {
        return ciudadResidencia;
    }
    /**
     * Asigna el valor al campo de ciudad de residencia
     * @param ciudadResidencia valor ingresado por el usuario
     */
    public void setCiudadResidencia(String ciudadResidencia) {
        this.ciudadResidencia = ciudadResidencia;
    }
    /**
     * Obtiene el nombre del departamento
     * @return
     */
    public String getDepartamento() {
        return departamento;
    }
    /**
     * Asigna el nombre del departamento
     * @param departamento
     */
    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }
    /**
     * Obtiene el valor del campo dirección
     * @return
     */
    public String getDireccion() {
        return direccion;
    }
    /**
     * Asigna el valor al campo dirección
     * @param direccion
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }
    /**
     * Obtiene el valor del campo email
     * @return
     */
    public String getEmail() {
        return email;
    }
    /**
     * Asigna el valor al campo email
     * @param email
     */
    public void setEmail(String email) {
        this.email = email;
    }
    /**
     * Obtiene el valor mensajes
     * @return
     */
    public Mensajes getMensaje() {
        return mensaje;
    }
    /**
     * Asigna el valor a mensaje
     * @param mensaje
     */
    public void setMensaje(Mensajes mensaje) {
        this.mensaje = mensaje;
    }
    /**
     * Obtiene el valor del campo no nombre completo
     * @return
     */
    public String getNombreCompleto() {
        return nombreCompleto;
    }
    /**
     * Asigna el valor al campo nombreCompleto
     * @param nombreCompleto: representa el nombre completo de la persona
     */
    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }
    /**
     * Obtiene el valor al campo nombre de usuario
     * @return
     */
    public String getNombreUsuario() {
        return nombreUsuario;
    }
    /**
     * Asigna el valor al campo nombre usuario
     * @param nombreUsuario: representa el nombre del usuario en el sistema
     */
    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }
    /**
     * Obtiene el valor del campo número documento
     * @return
     */
    public String getNumeroDocumento() {
        return numeroDocumento;
    }
    /**
     * Asigna el valor al campo número de documento
     * @param numeroDocumento: representa el número de documento de identificación del usuario
     */
    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }
    /**
     * Obtiene el valor del campo país
     * @return
     */
    public String getPais() {
        return pais;
    }
    /**
     * Asigna el valor al campo país
     * @param pais
     */
    public void setPais(String pais) {
        this.pais = pais;
    }
    /**
     * Obtiene el valor del campo password
     * @return
     */
    public String getPassword() {
        return password;
    }
    /**
     * Asinga el valor al campo password
     * @param password: contraseña de ingreso al sistema
     */
    public void setPassword(String password) {
        this.password = password;
    }
    /**
     * Obtiene el valor del campo profesión
     * @return
     */
    public String getProfesion() {
        return profesion;
    }
    /**
     * Asigna el valor al campo profesión
     * @param profesion
     */
    public void setProfesion(String profesion) {
        this.profesion = profesion;
    }
    /**
     * Obtiene el valor del campo teléfono de residencia
     * @return
     */
    public String getTelefonoResidencia() {
        return telefonoResidencia;
    }
    /**
     * Asigna el valor del campo teléfono de residencia
     * @param telefonoResidencia
     */
    public void setTelefonoResidencia(String telefonoResidencia) {
        this.telefonoResidencia = telefonoResidencia;
    }
    /**
     * Obtiene el valor del campo tipo documento
     * @return
     */
    public String getTipoDocumento() {
        return tipoDocumento;
    }
    /**
     * Asigna el valor al campo tipo documento
     * @param tipoDocumento
     */
    public void setTipoDocumento(String tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }
    /**
     * Obtiene el valor del campo tipo usuario
     * @return
     */
    public String getTipoUsuario() {
        return tipoUsuario;
    }
    /**
     * Asigna el valor del campo tipo usuario
     * @param tipoUsuario
     */
    public void setTipoUsuario(String tipoUsuario) {
        this.tipoUsuario = tipoUsuario;
    }
    /**
     * Realiza la modificación de los datos de un cliente
     * @return
     */
    public String editarCliente(){
        try{
            Cliente clienteNuevo = new Cliente();
            Ciudad ciudad = new Ciudad();
            ciudad.setIdCiudad(Long.valueOf(ciudadResidencia));
            Departamento deptoO = new Departamento();
            Pais paisO = new Pais();
            deptoO.setIdDepartamento(Long.valueOf(departamento));
            paisO.setIdPais(Long.valueOf(pais));
            deptoO.setPais(paisO);
            ciudad.setDepartamento(deptoO);

            clienteNuevo.setIdCliente(idCliente);
            if (tipoDocumento.equals(TipoDocumento.CEDULA.toString())) {
                clienteNuevo.setTipoDocumento(TipoDocumento.CEDULA);
            }
            if (tipoDocumento.equals(TipoDocumento.NIT.toString())) {
                clienteNuevo.setTipoDocumento(TipoDocumento.NIT);
            }
            clienteNuevo.setNumeroDocumento(numeroDocumento);
            clienteNuevo.setNombreCompleto(nombreCompleto);
            clienteNuevo.setTelefonoResidencia(telefonoResidencia);
            clienteNuevo.setCelular(celular);
            clienteNuevo.setDireccion(direccion);
            clienteNuevo.setProfesion(profesion);
            clienteNuevo.setCiudadResidencia(ciudad);
            clienteNuevo.setEmail(email);
            Usuario usuario = new Usuario();
            if(tipoUsuario.equals(TipoUsuario.ADMINISTRADOR.toString())){
                usuario.setTipoUsuario(TipoUsuario.ADMINISTRADOR);
            }
            if(tipoUsuario.equals(TipoUsuario.CLIENTE.toString())){
                usuario.setTipoUsuario(TipoUsuario.CLIENTE);
            }
            usuario.setUsuario(nombreUsuario);
            usuario.setPwd(password);
            clienteNuevo.setUsuario(usuario);

            getClienteEjb().editarCliente(clienteNuevo);
            mensaje.asignarMensajeInfo("La información del Cliente ha sido modificada");

        }catch(TiendaException e){
            mensaje.asignarMensajeError("common.error", e.getMessage());
        }
        catch (Exception e) {
            mensaje.asignarMensajeError("common.error", e.getMessage());
        }
        return ReglasNavegacion.list_clientes.toString();
    }
    /**
     * Método relacionado a la acción del botón cancelar de la pantalla
     * @return
     */
    public String cancelar(){
        ClienteListBean bean = new ClienteListBean();
        //return ReglasNavegacion.list_clientes.toString();
        return ReglasNavegacion.editar_datos_usuario.toString();
    }

    /**
     * Obtiene el clienteEjb
     * @return
     */
    public ClienteServiceLocal getClienteEjb() {
        return clienteEjb;
    }
    /**
     * Asigna clienteEjb
     * @param clienteEjb
     */
    public void setClienteEjb(ClienteServiceLocal clienteEjb) {
        this.clienteEjb = clienteEjb;
    }

    public Long getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(Long idCliente) {
        this.idCliente = idCliente;
    }


}
